package com.starkuz.controllers;

import com.starkuz.dao.ifaces.UserDao;
import com.starkuz.dto.LoginDto;
import com.starkuz.dto.UserDto;
import com.starkuz.dto.SetPeriodDto;
import com.starkuz.mailsender.ConfirmationSender;
import com.starkuz.mailsender.Sender;
import com.starkuz.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
import java.util.Map;


@Controller
public class AutorisationController {

    @Autowired
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    // считываем логин и пароль; если правильные - авторизуем, иначе - выкидываем на страницу с сообщением
    // (временно страница ошибки)
    @RequestMapping(value = "/autorization.html", method = RequestMethod.POST)
    public String autorize(LoginDto dto, HttpServletRequest req) {
        User user = userDao.findUserByLoginAndPassword(dto.getLogin(), dto.getPassword());
        if (user == null) {
            return "aut_err";
        } else {
            if (user.getStatus().equals(User.INACTIVE)){
                return "activation_start";
            }
            HttpSession session = req.getSession();
            session.setAttribute("user", user);
            return "templates";
        }
    }

    @RequestMapping(value = "/registration.html", method = RequestMethod.GET)
    public String registration(User dto,HttpServletRequest req, Map model) {
        HttpSession session = req.getSession();
        model.put("userDto", dto);
        return "registration";
    }

    //принятие данных с формы регистрации
    @RequestMapping(value = "/registration.html", method = RequestMethod.POST)
    public String registration(LoginDto loginDto, UserDto dto, HttpServletRequest req, Map model) {
        if (userDao.findUserByLogin(dto.getLogin()) != null) {
            model.put("loginDto", loginDto);
            model.put("message", "По данноуму e-mail адресу уже зарегистрирован пользователь");
            return "registration";
        } else {
            HttpSession session = req.getSession();
            userDao.addUser(dto);
            User user = userDao.findUserByLogin(dto.getLogin());
            if (user==null){
                model.put("cause", "одно из полей привышает допустимую длину");
                return "error"; //на случай если в базу по какой-то причине не добавится юзер
            }
            model.put("userDto", dto);
            ConfirmationSender.sendConfirmationMail(user.getLogin(), user.getId());
            session.setAttribute("user", null);
            return "activation_start";
        }
    }


    //для выхода
    @RequestMapping(value = "/logout.html", method = RequestMethod.GET)
    public String logout(HttpServletRequest req, LoginDto dto, Map model) {
        req.getSession().setAttribute("user", null);
        model.put("loginDto", dto);
        return "index";
    }

    //для активации юзера по ссылке
    @RequestMapping(value = "/activation.html", method = RequestMethod.GET)
    public String activate(HttpServletRequest req, @RequestParam(value = "id", required = true) Integer id, Map model) {
        User user = userDao.findUserById(id);
        if (user == null || !user.getStatus().equals(User.INACTIVE)) {
            model.put("cause", "Данный пользователь либо уже активирован, либо не проходил процедуру регистрации");
            return "error";
        } else {
            user.setStatus(User.FREE);
            userDao.updateUser(user);
            req.getSession().setAttribute("user", user);
            return "activation_finish";
        }
    }


}